package org.sloth.core.remote
{
	import flash.events.Event;
	
	public class RemoteMgr
	{
//============================================================================
//CONSTANT
//============================================================================
		private static const _uidProxyMap:Object = {};
//============================================================================
//PUBLIC
//============================================================================
		/**
		 * 
		 * @param funcName 需要要调用的远程服务函数名
		 * @param parameters 远程服务函数参数队列（参数在数组中的顺序与远程服务函数要求的参数顺序一致）
		 * @param destination 服务的目标。该值应与 services-config.xml 文件中的目标条目匹配。
		 * @param endpoint 服务器地址，比如 <code>http://127.0.0.1:8080/project/messagebroker/amf</code>
		 * @param completeCB 请求完成后回调，参数类型为 <code>RemoteVO</code>
		 * @param errorCB 请求失败后回调，参数类型为 <code>RemoteVO</code>
		 * @param data 请求前后需要传递的数据
		 * 
		 */		
		public static function send(
			funcName:String, parameters:Array, 
			destination:String, endpoint:String, 
			completeCB:Function = null, errorCB:Function = null, data:* = null):void
		{
			if (parameters == null) parameters = [];
			var vo:RemoteVO = new RemoteVO(funcName, parameters, destination, endpoint, completeCB, errorCB, data);
			
			var proxy:RemoteProxy = RemoteProxy.getInstance();
			proxy.addEventListener("complete", complete_handler);
			proxy.addEventListener("error", error_handler);
			
			_uidProxyMap[vo.uid] = proxy;
			
			proxy.send(vo);
		}
		
//============================================================================
//HANDLER
//============================================================================
		private static function complete_handler(event:Event):void
		{
			var proxy:RemoteProxy = event.currentTarget as RemoteProxy;
			proxy.removeEventListener("complete", complete_handler);
			proxy.removeEventListener("error", error_handler);
			
			var vo:RemoteVO = proxy.vo;
			vo.content = proxy.data;
			if (vo.completeCB != null) vo.completeCB(vo);
			
			delete _uidProxyMap[vo.uid];
		}
		private static function error_handler(event:Event):void
		{
			var proxy:RemoteProxy = event.currentTarget as RemoteProxy;
			proxy.removeEventListener("complete", complete_handler);
			proxy.removeEventListener("error", error_handler);
			
			var vo:RemoteVO = proxy.vo;
			vo.content = proxy.data;
			if (vo.errorCB != null) vo.errorCB(vo);
			
			delete _uidProxyMap[vo.uid];
		}
	}
}